/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.naotebuk.dao;

import br.com.naotebuk.modelo.Conserto;
import br.com.naotebuk.modelo.Produto;
import br.com.naotebuk.modelo.Situacao;
import br.com.naotebuk.modelo.TipoProduto;
import java.util.Date;
import java.util.List;
import javax.persistence.TemporalType;
import org.springframework.stereotype.Repository;

/**
 *
 * @author giovanni
 */
@Repository
public class ConsertoDao extends NaotebukDao<Conserto> {

    public List<TipoProduto> listarTiposDeProduto() {
        return em.createNamedQuery("TipoProduto.listar").getResultList();
    }

    public TipoProduto tipoProdutoPorId(Integer id) {
        return em.find(TipoProduto.class, id);
    }

    public Produto produtoPorId(Integer id) throws RuntimeException {
        return em.find(Produto.class, id);
    }

    public Situacao situacaoPorNome(String nomeSituacao) {
        return (Situacao) em.createNamedQuery("Situacao.buscaPorNome")
                .setParameter("nome", nomeSituacao)
                .getSingleResult();
    }

    public List<Situacao> listarSituacoes() {
        return em.createNamedQuery("Situacao.listar").getResultList();
    }

    public Situacao situacaoPorId(Integer id) {
        return em.find(Situacao.class, id);
    }

    public List<Conserto> listarConsertosEmAberto() throws RuntimeException {
        return em.createNamedQuery("Conserto.listarAbertos")
                .setParameter("situacao", situacaoPorNome("Aberto"))
                .getResultList();
    }

    public List<Conserto> listarConsertosEmAtraso() throws RuntimeException {
        return em.createNamedQuery("Conserto.listarAtrasados")
                .setParameter("situacao", situacaoPorNome("Aberto"))
                .setParameter("hoje", new Date(), TemporalType.DATE)
                .getResultList();
    }

    public List<Conserto> listarConsertosARetirar () throws RuntimeException {
        return em.createNamedQuery("Conserto.listarARetirar")
                .setParameter("situacao", situacaoPorNome("À Retirar"))
                .getResultList();
    }

    public List<Conserto> listaEntreDatas(Date de, Date ate) {
        return em.createNamedQuery("Conserto.listarEntreDatas")
                .setParameter("de", de)
                .setParameter("ate", ate)
                .getResultList();
    }
}